مفهوم حلقه یا Loop در برنامه نویسی VBA
مطلبی که امروز می خواهیم در مورد آن صحبت کنیم مفهوم حلقه یا Loop در برنامه نویسی VBA است .
فکر نمی کنم که لازم باشد در خصوص اهمیت حلقه ها در برنامه نویسی وی بی ای صحبتی بکنم .
بالاترین دلیل اهمیت این موضوع همین است که شما مشغول مطالعه این مطلب هستید .
حتما برای تان مهم است که می خواهید با چیزی به اسم حلقه یا Loop در برنامه نویسی VBA آشنا شوید.
و حتما برای تان مهم است که می خواهید از این قابلیت های کاربردی در برنامه نویسی خود استفاده کنید .
اما شاید ذهنیتی در مورد حلقه ها یا در اصطلاح برنامه نویسی Loop نداشته باشید .
شاید هم به سراغ یادگیری این قابلیت رفته باشید اما در یادگیری آن به مشکل برخورده باشید .
امروز می خواهیم بطور اصولی از ابتدا همه چیز را شروع کنیم .
از اینکه اصلا معنی و مفهوم حلقه ها چیست ؟
چند نوع حلقه داریم ؟
کجاها باید از حلقه ها استفاده کنیم ؟
چه جوری حلقه ها را باید ایجاد کنیم ؟
و چندین و چند سوال و پرسش دیگر که در طول این مطلب و آموزش به آنها خواهیم پرداخت .
من علیرضا شهرآئینی هستم و در این مطلب تمام سعی خود را می کنم که کار با حلقه ها را بصورت اصولی به شما آموزش دهم.
پس تا پایان این مطلب همراه من باشید .
مفهوم حلقه یا Loop در برنامه نویسی VBA
من برای یادگیری کار با حلقه ها به خیلی از سایت ها – چه ایرانی و چه خارجی – سر زدم .
همه هم به یک سبک و سیاق فقط مستقیم به سراغ اصل مطلب می روند .
بدون اینکه این نکته را در نظر بگیرند که شاید خواننده اصلا هیچ ذهنیتی از حلقه ها نداشته باشد .
و یا اگر هم ذهنیتی دارد آنقدر برایش گیج و نامفهوم است که بیشتر باعث ترس کاربر از اسم حلقه ها می شوند چه برسد به اینکه بخواهد با حلقه ها هم کار کند .
پس قبل از اینکه بخواهم به سراغ معرفی انواع حلقه ها و فرمول های مربوط به آنها برویم اصلا ببینیم که منظور از حلقه چیست ؟
حلقه یک اصطلاحی است در همه زبان ها برنامه نویسی و اشاره به کار یا کارهایی دارد که حالت تکراری پیدا می کنند .
اما اصلا چرا باید یک کار تکراری داشته باشیم و منظور از تکرار در برنامه نویسی چیست ؟
اجازه دهید به این سوالات بعدا پاسخ بدهم .
اما بیایید به همین مفهوم کار تکراری بپردازیم
مفهوم کار تکراری در دنیای اطراف ما .
ما با دنیای اطراف خودمان ارتباط بهتری برقرار می کنیم چون همه چیز در محیط اطراف ما قابل دیدن و لمس کردن است .
بیایید گشتی در دنیای پیرامون خود بزنیم ببینم که چه کارهایی هست که ما بصورت تکراری انجام می دهیم .
مثلا به تصویر زیر نگاه کنید .
این می تواند مثال خوبی از یک کار تکراری باشد .
ما در اینجا چه کاری را می خواهیم انجام دهیم .
درست است . بریدن یک تخته چوبی .
کاری که باید بکنیم این است که اره را به کمک نیروی دست بر روی این تخته به عقب و جلو بکشیم .
فرض کنید که تیغه اره ما ۵۰ سانتی متر طول دارد .
ما برای بار اول ۵۰ سانتی متر اره را به جلو می رانیم تا به انتهای آن برسیم .
برای بار دوم دوباره اره را به اندازه ۵۰ سانتی متر به عقب می کشیم تا دوباره به ابتدای اره برسیم .
این کار عقب و جلو کردن اره را باید بطور مداوم تکرار کنیم تا در نهایت این تخته چوبی برش بخورد .
پس این یک کار تکراری است .
از این دست کارهای تکراری در دنیای اطراف ما تا دلتان بخواهد وجود دارد .
چرخاندن یک پیچ با استفاده از یک آچار هم می تواند یک کاری باشد که در آن تکرار وجود دارد .
کوبیدن یک میخ با استفاده از یک چکش هم شامل چند ین حرکت تکراری است .
و یا خیلی از مثال ها و کارهای دیگر .
من فقط در این جا با استفاده از این مثال ها خواستم به شما یک ذهنیت در مورد کارهای تکراری بدهم .
که وقتی می گوییم کار تکراری یعنی چه ؟
حالا برویم به سراغ مفهوم کار تکراری در اکسل و برنامه نویسی VBA
مفهوم کار تکراری در اکسل و برنامه نویسی VBA
چرا ما باید در اکسل یک را بصورت تکراری انجام دهیم ؟
آیا اینکه یک کار را بخواهیم تکرار کنیم بد است یا خوب ؟
اول برویم به سراغ سوال اول و پاسخ آن را بررسی کنیم .
چرا باید یک کار را بصورت تکراری انجام دهیم ؟
اجازه دهید همه چیز را با یک مثال ساده شروع کنیم .
به تصویر زیر نگاهی بکنید .
اینها لیستی است از دانش آموزان یک کلاس که برای هر کدام از آنها یک ستون برای نمره آنها درج شده است .
حالا فرض کنیم که آقای معلم می خواهد به نمره هر دانش آموز ۲ نمره اضافه کند !!!.
خوب معلم شروع می کند از اولین نفر و ۲ نمره به نمره قبلی آن اضافه می کند .
حالا می رود به سراغ نفر دوم و دو نمره به نمره قبلی اش اضافه می کند .
حالا می رود به سراغ نفر سوم و دو نمره به نمره قبلی اش اضافه می کند .
بعد می رود به سراغ نفر چهارم و پنجم و ششم و همینطور تا نفر آخری که می تواند نفر بیستم یا سی ام باشد .
می بینید که این آقا یا خانم معلم باید برای بیست بار یا سی بار متوالی یک کار را تکرار کند .
از کجا معلوم که بخاطر این تکرار آقا یا خانم معلم قید همه چیز را بزند و اصلا از اضافه کردن نمرات منصرف شود .
پس به خاطر این دانش آموزان هم که شده باید زودتر یک فکری به حال این قضیه بکنیم .
فقط تا به اینجا متوجه شدید که چرا ما باید کار تکراری در اکسل بکنیم .
این یک نمونه بود از بین دهها و صدها کار تکراری که ما بعضی وقتها مجبور می شویم که در اکسل انجام دهیم .
فکر می کنم در اینجا به سوال دوم هم پاسخ دادیم .
یک کار تکراری به خودی خود چیز بدی نمی تواند باشد .
پس چه چیز می تواند بد باشد ؟
چیزی که بد است روش انجام این کار تکراری است .
اینکه خودمان بخواهیم این کار تکراری را انجام دهیم بد است .
پس چکار باید بکنیم . ؟
باید انجام این کار تکراری را به خود اکسل واگذار کنیم .
چه جوری ؟ با استفاده از همان چیزی که به اسم حلقه ها یا Loop می شناسیم .
پس با این مقدمه تازه می رسیم به سر اصل موضوع .
آشنایی و معرفی انواع حلقه ها در برنامه نویسی VBA
ما بطور کلی دو نوع حلقه یا Loop در برنامه نویسی VBA داریم .
البته هر کدام از این حلقه ها به نوبه خودشان شامل دو زیر مجموعه می شوند .
اما مبنای این دسته بندی ها و تقسیم ها چیست ؟
ببینید ما در برخی از موارد تعداد دفعاتی را که یک کار را باید تکرار کنیم را از قبل می دانیم .
برای اینکه بهتر این موضوع را ذهن شما قرار دهم باز اجازه دهید نگاهی بیندازیم به دنیای اطراف خودمان.
مثلا به تصویر زیر نگاه کنید .
این تصویر یک قفل درب حیاط است .
چیزی که احتمالا زیاد با آن سر و کار داریم .
همه ما می دانیم که برای قفل کردن این درب باید حداقل یک بار و حداکثر دوبار کلید آن را در داخل قفل بچرخانیم تا درب ما قفل شود .
مگر نه اینکه کاری که ما در اینجا می کنیم یعنی گرداندن کلید در داخل این قفل یک کار تکراری است ؟
اما چند بار باید این کار را تکرار کنیم ؟
جواب این سوال را هم از قبل می دانیم . ۲ بار
فرقی هم نمی کند که یک بچه کلید را بچرخاند یا یک آدم بزرگسال .
در هر حالت کلید بیشتر از دو بار در داخل این قفل نخواهد چرخید .
این مثال را در ذهن خود داشته باشید .
حالا به تصویر زیر نگاه کنید .
حتما از خود می پرسید که این دیگر چیست ؟
این هم یک نوع قفل است .
اما از آن قفل های قدیمی که به معنای واقعی کلمه قفل بودند نه مثل قفل های امروزی .
حالا چه جوری کار می کرد .
آن حلقه دایره ای انتهایی در سمت راست قفل را می بینید .
این حلقه دایره ای در حکم کلید این قفل است .
باید این حلقه دایره ای را بگیرید و آن را در داخل قفل بچرخانید تا قفل باز و یا برعکس اگر قفل باز است بسته شود .
اما چند بار باید بچرخانید ؟
معلوم نیست .
اگر از یک بچه بخواهید که این کار را بکند ممکن است چهار بار یا پنج بار یا بیشتر کلید را در داخل قفل بچرخاند .
اما اگر از یک بزرگسال بخواهید همین کار را بکند ممکن است دو بار ، سه بار ، یا چهار بار یا حتی بیشتر این کار انجام دهد .
فقط وقتی متوجه می شوید که دیگر نیازی به این تکرار ندارید که قفل شما یا کاملا باز شده است و یا اینکه کاملا بسته شده است .
اینها دو مثال از دنیای واقعی خودمان بود .
در مثال اول کاملا می دانستیم که چند بار باید یک کار را تکرار کنیم .
اما در مثال دوم دقیقا تعداد این دفعات برای ما مشخص نبود .
در دنیای برنامه نویسی هم قضیه دقیقا به همین شکل است .
بعضی وقت ها ما به خوبی می دانیم که برنامه یک کار را چند بار باید تکرار کند .
در این حالت به سراغ حلقه For رفته و از آن استفاده می کنیم .
اما بعضی از مواقع دیگر هست که ما خودمان هم نمی دانیم که برنامه چند بار باید یک کار را انجام دهد چه برسد به خود برنامه .
بنابراین در این جور مواقع که تعداد دفعات یک کار برای ما مشخص نیستبرای استفاده از حلقه یا Loop در برنامه نویسی VBA به سراغ حلقه های نوع Do می رویم و از آنها استفاده می کنیم .
حالا که با فلسفه هر کدام از این حلقه ها آشنا شدید ادامه بحث را دنبال کنید .
در اینجا به بررسی همه این حلقه ها و زیرمجموعه های آنها می پردازیم .
۱- حلقه For ——-Next
اولین حلقه ای که می خواهیم در بحث حلقه یا Loop در برنامه نویسی VBA به بررسی آن بپردازیم حلقه For است
معنی For را که می دانید. یعنی برای ….
چه موقع از این حلقه استفاده می کنیم .
گفتیم که وقتی از این تابع استفاده می کنیم که می دانیم چند بار قرار است یک را تکرار کنیم .
اول بیایید نگاهی به این تابع و ساختار آن بیندازیم .
[For counter = start To end [step [statements] [Exit For] [statements] [Next [counter
در کد بالا counter یک متغیر است که قرار است تعداد دفعات تکرار را برای حلقه نگه می دارد .
start یک عدد است که نقطه شروع را مشخص می کند .
End یک عدد است که نقطه پایان حلقه را مشخص می کند .
statement همان کاری است که می خواهیم برنامه برای ما انجام دهد .
Exit For نقطه خروج را از تابع مشخص می کند .
Next هم کلمه ای است که حلقه را به گردش در می آورد .
حالا با هم چند مثال را مورد بررسی قرار می دهیم تا بهتر با این حلقه آشنا شویم .
برگردیم به همان مثال معلم و دانش آموزان و اضافه کردن دو نمره به هر دانش آموز .
برای این کار حلقه خود را بصورت زیر می نویسیم .
()Sub addnumber Dim i As Integer For i = 2 To 13 Range("E" & i).Select ActiveCell.Value = ActiveCell.Value + 2 Next i End Sub
حالا برویم با هم این حلقه و کدهای آن را تفسیر کنیم .
در اولین خط از این کد ما یک متغیر از نوع Integer تعریف کردیم .
این متغیر کار شمارش تعداد دفعات انجام کار را برای ما ذخیره می کند .
در خط بعدی حلقه خود را ایجاد کردیم .
در این خط گفتیم که حلقه از عدد ۲ شروع شود و یکی یکی جلو برود تا به عدد ۱۳ برسد .
اما این عدد ۲ از کجا آمد و عدد ۱۳ از کجا ؟
اگر به لیست دانش آموزان دقت کنید می بینید که اولین نمره مربوط به دانش آموزان از ردیف دوم شروع می شود .
پس عدد شمارنده خود را بر روی ۲ می گذاریم . در واقع اینجا می خواهیم که حلقه از ردیف شماره ۲ شروع شود .
در خط بعدی محدوده مورد نظر را مشخص کرده ایم .
در این محدوده قرار است ما یک کار خاص را چند بار تکرار کنیم .
اما این محدوده را چطور تعیین می کنیم . در اینجا از شمارنده حلقه برای تعیین محدوده هم کمک می گیریم .
حلقه ما برای بار اول از عدد ۲ شروع می شود .
یعنی در حلقه ما شمارنده i برابر ۲ می شود .
پس در داخل حلقه برای بار اول هر جا که حرف i داشته باشیم به جای ان عدد ۲ قرار می گیرد .
حالا ما کجا i داریم .
درست است در عبارت ( & ” Range(” E پس در اینجا محدوده ما می شود E2 .
در خط بعدی ما مشخص می کنیم که هر مقداری که در سلول E2 وجود دارد را با عدد ۲ جمع کرده و نتیجه جدید را در داخل سلول درج کند .
در خط آخر هم با استفاده از دستور Next می خواهیم که به سراغ مقدار بعدی برای i برود و این بار عدد ۳ را به جای i بگذارد .
و این قضیه ادامه پیدا می کند تا زمانی که مقدار i به عدد ۱۳ برسد .
در اینجا کار حلقه ما تمام می شود و ما توانستیم کار تکراری خود را به راحتی به سرانجام برسانیم .
فقط کافی است که این روال را اجرا کنیم تا نتیجه نهایی را مشاهده کنیم .
در زیر می توانید نتیجه اجرای این کدها را مشاهده کنید .
اما به نمره دو دانش آموز آخر نگاه کنید .
دانش آموز ماقبل آخر قبلا نمره اش ۱۹ بوده و حالا ما دو نمره به او اضافه کرده ایم و نمره جدیدش شده ۲۱ !!!!
دانش آموز آخری هم قبلا نمره اش ۲۰ بوده و حالا ما دو نمره به او اضافه کرده ایم و نمره جدیدش شده ۲۲ !!!!.
عجب سوتی شده .
حالا باید چکار کنیم .
خیلی راحت باید به برنامه بگوییم که فقط به دانش آموزانی دو نمره اضافه کن که نمره آنها کمتر از ۱۹ است .
یعنی به دانش آموزانی که نمره بیشتر از ۱۹ دارند لازم نیست مقداری را اضافه کند .
پس کدهای خودمان را به این صورت تغییر می دهیم .
()Sub addnumber Dim i As Integer For i = 2 To 13 Range("E" & i).Select If ActiveCell.Value < 19 Then ActiveCell.Value = ActiveCell.Value + 2 End If Next i End Sub
به همین راحتی قضیه را حل کردیم و دیگر نمره بالاتر از ۲۰ نداریم که سوتی شود .
اما یک لحظه صبر کنید .
مثل اینکه یک نفر اعتراض دارد .
دانش آموزی که نمره اولش ۱۹ بوده می گوید که شما چطور می خواهید به کسی که ۱۸ گرفته ۲ نمره اضافه کنید و نمره اش را بکنید ۲۰ اما به من نمی خواهید یک نمره بدهید که نمره من هم ۲۰شود ؟
این هم حرف درست و اعتراض بجایی است .
پس باز هم کدهای خود را تکمیل تر می کنیم .
()Sub addnumber Dim i As Integer For i = 2 To 13 Range("E" & i).Select If ActiveCell.Value < 19 Then ActiveCell.Value = ActiveCell.Value + 2 ElseIf ActiveCell.Value = 19 Then ActiveCell.Value = ActiveCell.Value + 1 End If Next i End Sub
در اینجا ما یک متغیر داریم به نام i .
این متغیر کار یک شمارنده را برای این حلقه ایفا می کند .
این متغیر کار شمارش را از عدد ۲ شروع کرده و تا عدد ۱۳ یکی یکی جلو می رود .
این حلقه قرار است ۱۲ بار تکرار شود .
برای بار اول این متغیر عدد را می گیرد .
پس در اولین بار از اجرای حلقه سلول E2 انتخاب می شود و در ادامه کارهای مورد نظر بر روی این سلول تمجام می شود .
در نوبت بعدی این متغیر عدد ۳ را می گیرد .
در این حالت سلول E3 انتخاب می شود و مقادیر قبلی در آن با عدد ۲ جمع می شود .
و این کار یکی یکی تا عدد ۱۳ تکرار می شود تا حلقه ما کامل شود .
می بینید که به چه راحتی همه مشکلات را حل کردیم .
من در اینجا سعی کردم که با یک مثال کاملا عملی نحوه استفاده از این حلقه را به شما نشان بدهم .
و شما را با پیچ و خم ها و سوالاتی که ممکن است پیش بیاید مواجه کنم که ببینید برای هر مشکل باید یک راه حل مناسب را پیدا کنید .
و البته نخواستم که مثل سایت های دیگر فقط حلقه For استفاده کنم و بگویم که از سلول شماره ۱ تا سلول شماره ۱۰۰ یک عدد خاص و یا یک اسم مشخص را بنویس .
و بعد بگویم که کاربرد حلقه این است .
هدفم این بود یک سوال واقعی را مطرح و پاسخ درستی را برای آن در نظر بگیریم .
البته هنوز کار ما با این حلقه تمام نشده است .
باز هم بحث را ادامه می دهیم و مثال های دیگری را دنبال خواهیم کرد .
استفاده از قابلیت Step در حلقه For
Step قابلیتی است که با استفاده از آن می توانیم به حلقه بگوییم که چند تا چند تا جلو برود .
اگر step را ننویسیم شمارنده حلقه ما یکی یکی جلو می رود.
اما اگر step را بنویسم مطابق این عدد جلو خواهد رفت .
من که خودم متوجه این توضیحات خودم نمی شوم .
بگذارید یک مثال بزنم .
به کدهای زیر نگاه کنید
()Sub addnumber2 Dim i As Integer For i = 2 To 13 Step 2 Rows(i).Interior.Color = vbyellow Next i End Sub
در اینجا از حلقه خود می خواهیم که در ۱۲ بار اجرا شود .
اما به جای اینکه یکی یکی کار شمارش را انجام دهد دو تا دوتا جلو برود .
یعنی دفعه اول عدد ۲ بعد ۴ و بعد ۶ و به همین ترتیب تا آخر .
دفعه اول که متغیر ما عدد ۲ را به خود می گیرد ردیف های شماره ۲ به رنگ زرد در می آیند .
نوبت بعد عدد ۴ در متغیر ما قرار می گیرد و این بار ردیف شماره ۴ به رنگ زرد درمی آید .
و به همین ترتیب کار ادامه پیدا می کند .
در اینجا با استفاده از این حلقه از برنامه می خواهیم که ردیف های موجود در محدوده مورد نظر ما را بصورت یک در میان به رنگ زرد درآورد .
مطالب زیر را حتما مطالعه کنید
ذخیره نمودارها با کدهای VBAبصورت تصویر+راهنمای گام به گام
لیست باکس ها در برنامه نویسی VBA ؛ تمام چیزی که باید بدانید .
۷ اشتباه در کدنویسی VBA که ممکن است شما هم مرتکب شوید ؟
توی این آموزش راجع به اشتباهاتی که ممکن است در برنامه نویسی VBA مرتکب آنها شوید صحبت می کنیم .
با این خطای Runtime Error 1004 در VBA چکار کنیم ؟
در این آموزش راجع به خطایی به اسم Run time error 1004 در برنامه نویسی وی بی ای با هم صحبت می کنیم .
دیدگاهتان را بنویسید